package com.webguard.outlierdetection.interceptor;


import com.webguard.outlierdetection.untils.JwtUtil;
import com.webguard.outlierdetection.untils.ThreadLocalUtil;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import java.util.Map;


@Slf4j
@Component
public class LoginCheckInterceptor implements HandlerInterceptor {
    @Override//目标资源方法运行前运行, 返回true: 放行, 放回false, 不放行
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {

        //加上下列代码可在没配置跨域信息，成功解析jwt
        // OPTIONS ：用于向服务器请求一些特殊的验证信息的请求方式，
        // 请求通过后，会在响应头中添加一个Allow，内包含这个服务器接口所支持的请求方式，然后会向服务器进行下一次真实的POST/GET请求
        if ("OPTIONS".equals(request.getMethod())) {
            System.out.println("OPTIONS请求，放行");
            return true;
        }

        System.out.println(request.getHeader("Authorization"));
        System.out.println(request.getHeaderNames());
        //3.获取请求头中的令牌（token）。
        String jwt = request.getHeader("Authorization");


        //5.解析token，如果解析失败，返回错误结果（未登录）。
        try {
            Map<String,Object> claims= JwtUtil.parseToken(jwt);
            //由于每个用户的登录时token唯一，且独占一个线程，故将此作为本线程的全局变量
            ThreadLocalUtil.set(claims);

            log.info("令牌合法, 放行");
            return true;
        } catch (Exception e) {//jwt解析失败
            e.printStackTrace();
            log.info("解析令牌失败, 返回未登录错误信息");
            response.setStatus(401);
            return false;
        }


    }

    @Override//目标资源方法运行后运行
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("postHandle");

    }

    @Override//视图渲染完毕后运行, 最后运行
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        //请求完成后,清空ThreadLocal中的数据
        ThreadLocalUtil.remove();
        System.out.println("afterCompletion");
    }
}
